﻿
using System.Windows.Forms;
using Wpf2.ViewModels;

namespace Wpf2.Models
{
    public class Products : PropertyChangedBase
    {
        private int _idProductAuto;
        private string _idPro;
        private string _namePro;
        private string _description;
        private int _inventoryCount;
        private double _width;
        private double _height;
        private double _m2;
        private decimal _totalOutPayment;
        private decimal _totalInPayment;
        /// <summary>
        /// Xác định ở trường hợp xuất hóa đơn là giá sĩ hay giá lẽ
        /// - true : giá sĩ || false : giá lẽ
        /// </summary>
        private bool isCostPrice;
        /// <summary>
        /// Dùng để xác định hóa đơn xuất là loại Đá Hoa Cương
        ///  - True : Đá Hoa Cương || false : loại thường. 
        ///  Nếu là Đá Hoa Cương thì phải tính Dài * Rộng * Số lượng = M2 => thành tiền = M2 * Price
        /// </summary>
        private bool isMarble;
        private decimal _price;
        private decimal _sellprice;
        private decimal _costprices;
        private int _catalogId;
        private int _unitId;
        private string _catalogName;
        private string _unitName;
        

        //Have to emplement Method OnPropertyChaged for _unit and _catalog to refresh data on view
        private Unit _unit;
        public Catalogs Catalog;

        public decimal TotalOutPayment
        {
            get { return _totalOutPayment; }
            set { _totalOutPayment = value; OnPropertyChanged("totalOutPayment"); }
        }
        public decimal TotalInPayment
        {
            get { return _totalInPayment; }
            set { _totalInPayment = value; OnPropertyChanged("TotalInPayment"); }
        }
        public Unit Unit
        {
            get { return _unit; }
            set { _unit = value; UnitName = value.UnitName ;OnPropertyChanged("unit"); }
        }

        /// <summary>
        /// Hàm tính toán thành tiền của hóa đơn xuất. Nếu là Đá hoa cương thì sẽ bằng: ProductM2 * Price, không phải thì bằng: Inventory * Price.
        ///  - Hàm được chạy khi có thay đổi về (ProductHeight, ProductWidth, InventoryCount) và IsCostPrice => thay đổi Price
        /// ps:/ Price sẽ được tính toán trước.
        /// </summary>
        private void calculatePayment()
        {
            if (IsMarble)
            {
                TotalOutPayment = (decimal)ProductM2 * Price;
                TotalInPayment = (decimal)ProductM2 * CostPrice;
            }
            else
            {
                TotalOutPayment = InventoryCount * Price;
                TotalInPayment = InventoryCount * CostPrice;
            }
        }

        /// <summary>
        /// Hàm tính toán M2 của sản phẩm.
        ///  - Hàm được chạy khi có thay đổi: ProductHeight, ProductWidth và InventoryCount.
        ///   ps:/ Khi calculateM2() được chạy nó sẽ kích hoạt calculateOutPayment() thông qua thay đổi thuộc tính ProductM2
        /// </summary>
        private void calculateM2()
        {
            ProductM2 = ProductHeight * ProductWidth * InventoryCount;
            calculatePayment();
        }

        /// <summary>
        /// Đưa dài rộng về 0.
        ///  - Vấn đề là vì dài rộng kiểu double khi bind lên giao diện không gõ  "." được nên phải dùng "#.#" => lúc ẩn rồi hiện => lại k xuất hiện => phải trả về 0 cho chắc chắn
        /// </summary>
        private void resetWidthAndHeight()
        { 
            ProductWidth = 0;
            ProductHeight = 0;
        }

        /// <summary>
        /// Dùng để xác định hóa đơn xuất là loại Đá Hoa Cương
        ///  - True : Đá Hoa Cương || false : loại thường. 
        ///  Nếu là Đá Hoa Cương thì phải tính Dài * Rộng * Số lượng = M2 => thành tiền = M2 * Price
        /// </summary>
        public bool IsMarble
        {
            get { return isMarble; }
            set { isMarble = value; calculatePayment(); }
        }

        /// <summary>
        /// Giá để xuất ra trong trường hợp là xuất hóa đơn.
        /// Biến này phụ thuộc vào IsCostPrice
        /// </summary>
        public decimal Price
        {
            get { return _price; }
            set { _price = value; calculatePayment(); OnPropertyChanged("Price"); }
        }

        /// <summary>
        /// - Biến để xác định sản phẩm đang được xuất hóa đơn theo giá nào? sỉ hay lẽ.
        /// - Có 1 vấn đề là lúc đầu khi đã chọn sản phẩm nhưng k có cái gì để tác động kích hoạt Price
        ///  => kích hoạt thông qua khi biến SellPrice được set (vì cái này chỉ set 1 lần đầu tiên)
        /// </summary>
        public bool IsCostPrice
        {
            get { return isCostPrice; }
            set
            {
                isCostPrice = value;
                Price = value ? CostPrice : SellPrice;
                OnPropertyChanged("IsCostPrice");
            }
        }
        
        public Catalogs catalog
        {
            get { return Catalog; }
            set { Catalog = value; CatalogName = value.CatalogName; OnPropertyChanged("catalog"); }
        }

        public int ProductIdAuto
        {
            get { return _idProductAuto; }
            set
            {
                if (_idProductAuto != value)
                {
                    _idProductAuto = value;
                    OnPropertyChanged("ProductIdAuto");
                }
            }

        }
        public string ProductId
        {
            get { return _idPro; }
            set
            {
                if (_idPro != value)
                {
                    _idPro = value;
                    OnPropertyChanged("ProductId");
                }
            }

        }

        public string ProductName
        {
            get { return _namePro; }
            set
            {
                if (_namePro != value)
                {
                    _namePro = value;
                    OnPropertyChanged("ProductName");
                }
            }

        }

        public string ProductDescription
        {
            get { return _description; }
            set
            {
                if (_description != value)
                {
                    _description = value;
                    OnPropertyChanged("ProductDescription");
                }
            }

        }

        public int InventoryCount
        {
            get { return _inventoryCount; }
            set
            {
                if (_inventoryCount != value)
                {
                    _inventoryCount = value;
                    calculateM2();
                    //TotalInPayment = value * CostPrice;
                    OnPropertyChanged("InventoryCount");
                }
            }

        }

        public double ProductWidth
        {
            get { return _width; }
            set
            {
                if (_width == value) return;
                _width = value;
                calculateM2();
                OnPropertyChanged("ProductWidth");
            }

        }

        public double ProductHeight
        {
            get { return _height; }
            set
            {
                if (_height == value) return;
                _height = value;
                calculateM2();
                OnPropertyChanged("ProductHeight");
            }

        }

        public double ProductM2
         {
             get { return _m2; }
             set
             {
                 if (_m2 == value) return;
                 _m2 = value;
                 OnPropertyChanged("ProductM2");
             }

         }

        public decimal SellPrice
         {
             get { return _sellprice; }
             set
             {
                 if (_sellprice != value)
                 {
                     _sellprice = value;
                     TotalOutPayment = value * InventoryCount;
                     IsCostPrice = false; // kích hoạt để tính toán Biến Price....
                     OnPropertyChanged("SellPrice");
                 }
             }

         }
        public decimal CostPrice
         {
             get { return _costprices; }
             set
             {
                 if (_costprices != value)
                 {
                     _costprices = value;
                     TotalInPayment = value * InventoryCount;
                     OnPropertyChanged("CostPrice");
                 }
             }

         }
        public int CatalogId
         {
             get { return _catalogId; }
             set
             {
                 if (_catalogId != value)
                 {
                     _catalogId = value;
                     OnPropertyChanged("CatalogId");
                 }
             }

         }

        public int UnitId
         {
             get { return _unitId; }
             set
             {
                 if (_unitId != value)
                 {
                     _unitId = value;
                     OnPropertyChanged("UnitId");
                 }
             }

         }
        public string CatalogName
         {
             get { return _catalogName; }
             set
             {
                 if (_catalogName != value)
                 {
                     _catalogName = value;
                     OnPropertyChanged("CatalogName");
                 }
             }

         }

        public string UnitName
         {
             get { return _unitName; }
             set
             {
                 if (_unitName != value)
                 {
                     _unitName = value;
                     OnPropertyChanged("UnitName");
                 }
             }

         }
        
    }
}

